import java.util.Scanner;

public class demo {

//    另类加法
//    给定两个int A和B。编写一个函数返回A+B的值，但不得使用+或其他算数运算符。
//测试样例：
//1,2
//返回：3

    //1. 二进制位异或运算相当于对应位相加，不考虑进位
//比如： 1 ^ 1 = 0 ---> 1 + 1 = 0 (当前位值为0，进一位)
// 1 ^ 0 = 1 ---> 1 + 0 = 1 (当前位值为1)
// 0 ^ 0 = 0 ---> 0 + 0 = 0 (当前位值为0)
//2. 二进制位与运算左移一位相当于对应位相加之后的进位
//比如： 1 & 1 = 1 ---> 1 + 1 = 0 (当前位的值进一位)
//1 & 0 = 0 ---> 1 + 0 = 1 (当前位的值不进位)
//0 & 0 = 0 ---> 0 + 0 = 0 (当前位的值不进位)
//3. 两个数相加：对应二进制位相加的结果 + 进位的结果
//比如：3 + 2 --> 0011 + 0010 --> 0011 ^ 0010 + ((0011 & 0010) << 1)
//---> (0011 ^ 0010) ^ ((0011 & 0010) << 1)， 当进位之后的结果为0时，相加结束
    public int addAB(int A, int B) {
        int a = A^B;
        int b = (A&B)<<1;
        while (b != 0) {
            int t = a^b;
            b = (a&b)<<1;
            a = t;
        }
        return a;
    }





    //    走方格的方案数
//    请计算n*m的棋盘格子（n为横向的格子数，m为竖向的格子数）从棋盘左上角出发沿着边缘线从左上角走到右下角，
//    总共有多少种走法，要求不能走回头路，即：只能往右和往下走，不能往左和往上走。
//    1.对于n*m(3*3)的格子，有两种情况
//a. 如果n或者m为1，则只有一行或者一列，从左上角走到右下角的路径数为n + m
// 比如： 1 * 1格子，可以先向下走，再向右走，到达右下角；或者先向右走，
// 再向下走，到达右下角，共两条，即 1 + 1 = 2，对于1 * m和 n * m的
//b. 如果n,m都大于1，那么走到[n][m]格子的右下角只有两条路径，
// <1>: 从[n - 1][m]格子的右下角向下走，到达
// <2>: 从[n][m - 1]格子的右下角向右走，到达
// 所以走到[n][m]格子的右下角的数量为[n-1][m] + [n][m - 1],可以通过递归实现，情况a为递归的终止条件。
    public static int fun(int a, int b) {
        // if(a==1 || b==1) {  //下面那代码的简化
        if((a==1&&b>=1) || (a>=1&&b==1)) {
            return a+b;
        }else {
            return fun(a-1, b) + fun(a, b-1);
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        System.out.println(fun(n,m));
    }
}
